package chapter7;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author caiya
 * @date 2020/3/31 22:03
 * @description
 */
@Slf4j
public class CyclicBarrierTest2 {
    /**
     * demo演示：CyclicBarrier的可复用性，一个任务需要阶段1、2、3顺序执行，使用2个线程分别执行，也就说每个线程需要单独执行阶段1、2、3
     */
    static volatile CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
        @Override
        public void run() {
            // 这段代码在每次所有线程冲破屏障点都会执行一遍!!!，也就说3个阶段会执行3遍！！！
            log.debug(Thread.currentThread().getName() + " CyclicBarrier 调用!");
        }
    });

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 2; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        log.debug("线程：{} 执行阶段 1", Thread.currentThread().getName());
                        cyclicBarrier.await();

                        log.debug("线程：{} 执行阶段 2", Thread.currentThread().getName());
                        cyclicBarrier.await();

                        log.debug("线程：{} 执行阶段 3", Thread.currentThread().getName());
                        cyclicBarrier.await();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        executorService.shutdown();
    }
}
